package edu.gdpu.gc;

/**
 * @author mazebin
 * @date 2021年 07月15日 23:10:02
 * 判断jvm是否使用引用计数法判断对象是否存活
 * 答案：不是，因为这个方法无法解决对象之间的循环引用问题
 * JVM使用的是可达性分析算法
 *   通过一系列可以称为GCRoots的对象作为起始点，从这些节点开始向下搜索，搜索所走过的路径成为引用链，当一个对象到GCRoots 没有任何引用链相连，
 *   （图论，就是从GCRoots到这个对象不可达时），则证明这个对象是不可用的。
 * -verbose:gc
 * -Xms20m  最小值
 * -Xmx20m  最大值
 * -Xmn10m   年轻代的大小
 * -XX:+PrintGCDetails
 */
public class ReferenceCountGC {
    private Object instance = null;
    private static  final int _1MB=1024*1024;
    //只是为了占内存以便查看GC日志
    private byte[] bytes = new byte[2*1024];

    public static void main(String[] args) {
        test();
    }
    private static void test(){
        ReferenceCountGC gc1 = new ReferenceCountGC();
        ReferenceCountGC gc2 = new ReferenceCountGC();
        gc1.instance=gc2;
        gc1.instance=gc1;
        gc1 = null;
        gc2 =null;
        System.gc();
    }
    /**
     *
     1493K->694K说明虚拟机并没有因为这两个对象互相引用就不回收他们
     [GC (System.gc()) [PSYoungGen: 1493K->488K(6144K)] 1493K->694K(19968K), 0.0007955 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
     [Full GC (System.gc()) [PSYoungGen: 488K->0K(6144K)] [ParOldGen: 206K->611K(13824K)] 694K->611K(19968K), [Metaspace: 2984K->2984K(1056768K)], 0.0045525 secs] [Times: user=0.08 sys=0.00, real=0.00 secs]
     Heap
     PSYoungGen      total 6144K, used 169K [0x00000000ff980000, 0x0000000100000000, 0x0000000100000000)
     eden space 5632K, 3% used [0x00000000ff980000,0x00000000ff9aa558,0x00000000fff00000)
     from space 512K, 0% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff80000)
     to   space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000)
     ParOldGen       total 13824K, used 611K [0x00000000fec00000, 0x00000000ff980000, 0x00000000ff980000)
     object space 13824K, 4% used [0x00000000fec00000,0x00000000fec98ec0,0x00000000ff980000)
     Metaspace       used 3027K, capacity 4496K, committed 4864K, reserved 1056768K
     class space    used 328K, capacity 388K, committed 512K, reserved 1048576K

     */


}
